home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / getopt.c,v < prev    next >
Text File  |  1990-02-14  |  3KB  |  129 lines

  1. head     1.2;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.2
  10. date     90.02.14.18.18.21;  author douglis;  state Exp;
  11. branches ;
  12. next     1.1;
  13.  
  14. 1.1
  15. date     88.06.27.16.18.42;  author ouster;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19.  
  20. desc
  21. @@
  22.  
  23.  
  24. 1.2
  25. log
  26. @fixed bug relating to calling getopt on two different argv vectors.
  27. @
  28. text
  29. @/*
  30.  * Copyright (c) 1987 Regents of the University of California.
  31.  * All rights reserved.
  32.  *
  33.  * Redistribution and use in source and binary forms are permitted
  34.  * provided that this notice is preserved and that due credit is given
  35.  * to the University of California at Berkeley. The name of the University
  36.  * may not be used to endorse or promote products derived from this
  37.  * software without specific written prior permission. This software
  38.  * is provided ``as is'' without express or implied warranty.
  39.  */
  40.  
  41. #if defined(LIBC_SCCS) && !defined(lint)
  42. static char sccsid[] = "@@(#)getopt.c    4.6 (Berkeley) 4/19/88";
  43. #endif /* LIBC_SCCS and not lint */
  44.  
  45. #include <stdio.h>
  46.  
  47. /*
  48.  * get option letter from argument vector
  49.  */
  50. int    opterr = 1,        /* if error message should be printed */
  51.     optind = 1,        /* index into parent argv vector */
  52.     optopt;            /* character checked for validity */
  53. char    *optarg;        /* argument associated with option */
  54.  
  55. #define    BADCH    (int)'?'
  56. #define    EMSG    ""
  57. #define    tell(s)    { \
  58.     if (opterr) { \
  59.         fputs(*nargv, stderr); \
  60.         fputs(s, stderr); \
  61.         fputc(optopt, stderr); \
  62.         fputc((int)'\n', stderr); \
  63.     } \
  64.     return(BADCH); \
  65. }
  66.  
  67. getopt(nargc, nargv, ostr)
  68.     int nargc;
  69.     char **nargv, *ostr;
  70. {
  71.     static char *place = EMSG;        /* option letter processing */
  72.     register char *oli;            /* option letter list index */
  73.     static char **lastargv;
  74.     char *index();
  75.  
  76.     if (!*place) {                /* update scanning pointer */
  77.             lastargv = nargv;
  78.     } else if (lastargv != nargv) {
  79.             place = EMSG;
  80.         lastargv = nargv;
  81.     }    
  82.     if (!*place) {                /* update scanning pointer */
  83.         if (optind >= nargc || *(place = nargv[optind]) != '-')
  84.             return(EOF);
  85.         if (place[1] && *++place == '-') {    /* found "--" */
  86.             ++optind;
  87.             return(EOF);
  88.         }
  89.     }                     /* option letter okay? */
  90.     if ((optopt = (int)*place++) == (int)':' ||
  91.         !(oli = index(ostr, optopt))) {
  92.         if (!*place)
  93.             ++optind;
  94.         tell(": illegal option -- ");
  95.     }
  96.     if (*++oli != ':') {            /* don't need argument */
  97.         optarg = NULL;
  98.         if (!*place)
  99.             ++optind;
  100.     }
  101.     else {                    /* need an argument */
  102.         if (*place)            /* no white space */
  103.             optarg = place;
  104.         else if (nargc <= ++optind) {    /* no arg */
  105.             place = EMSG;
  106.             tell(": option requires an argument -- ");
  107.         }
  108.          else                /* white space */
  109.             optarg = nargv[optind];
  110.         place = EMSG;
  111.         ++optind;
  112.     }
  113.     return(optopt);                /* dump back option letter */
  114. }
  115. @
  116.  
  117.  
  118. 1.1
  119. log
  120. @Initial revision
  121. @
  122. text
  123. @d45 1
  124. d49 6
  125. d61 1
  126. a61 1
  127.     }                    /* option letter okay? */
  128. @
  129.